var express = require('express');
var router = express.Router();
const multer = require('multer');
const XLSX = require('xlsx');
const fs = require('fs');
const path = require('path');

// 确保上传目录存在
const uploadDir = path.join(__dirname, '../../../../devDocument/');
if (!fs.existsSync(uploadDir)) {
    try {
        fs.mkdirSync(uploadDir, { recursive: true });
        console.log(`上传目录创建成功: ${uploadDir}`);
    } catch (err) {
        console.error(`创建上传目录失败: ${err.message}`);
    }
}

// 硬盘存储配置
const diskStorage = multer.diskStorage({
    destination: (req, file, cb) => {
        cb(null, uploadDir);
    },
    filename: (req, file, cb) => {
        let filename = "";
        // 直接使用req.body.type（multer会自动解析同表单的文本字段）
        switch(req.body.type){
            case "1":
                filename = "软件开发文档.docx";
                break;
            case "2":
                filename = "数据库文档.docx";
                break;
            case "3":
                filename = "mysql数据库sql脚本.sql";
                break;
            case "4":
                filename = "icon.js";
                break;
            case "5":
                filename = "数据库关系图.drawio";
                break;
            default:
                filename = file.originalname;
        }
        cb(null, filename);
    }
});

// 内存存储引擎
const memoryStorage = multer.memoryStorage();

// 优化后的中间件：只处理一次文件，避免重复解析
const dynamicUpload = (req, res, next) => {
    // 先通过multer解析文件和文本字段（一次处理即可）
    // 这里直接使用single('file')，同时会自动解析data中的type字段
    const upload = multer({
        // 临时使用内存存储，后续根据type决定最终存储方式
        storage: memoryStorage,
        limits: { fileSize: 100 * 1024 * 1024 }
    }).single('file');

    upload(req, res, (err) => {
        if (err) {
            console.error(`文件解析错误: ${err.message}`);
            return res.status(400).json({
                code: 400,
                msg: `文件解析失败: ${err.message}`
            });
        }

        // 如果没有文件，直接返回错误（提前拦截）
        if (!req.file) {
            return res.status(400).json({
                code: 400,
                msg: "未收到文件，请检查上传内容"
            });
        }

        // 根据type选择最终存储策略（硬盘/内存）
        if (req.body.type) {
            console.log("使用硬盘存储，type值为: " + req.body.type);
            // 手动将内存中的文件写入硬盘（避免重复解析请求）
            const filePath = path.join(uploadDir, getFilename(req, req.file));
            fs.writeFile(filePath, req.file.buffer, (err) => {
                if (err) {
                    return res.status(500).json({
                        code: 500,
                        msg: "文件保存失败"
                    });
                }
                // 更新req.file信息（适配后续逻辑）
                req.file.path = filePath;
                req.file.filename = getFilename(req, req.file);
                next();
            });
        } else {
            next();
        }
    });
};

// 提取文件名生成逻辑为单独函数（复用）
function getFilename(req, file) {
    switch(req.body.type){
        case "1":
            return "软件开发文档.docx";
        case "2":
            return "数据库文档.docx";
        case "3":
            return "mysql数据库sql脚本.sql";
        case "4":
            return "icon.js";
        case "5":
            return "数据库关系图.drawio";
        default:
            return file.originalname;
    }
}

// 文件上传接口
router.post("/putDocument", dynamicUpload, async function(req, res) {    
    console.log('接收到文件上传请求，type参数:', req.body.type);
    console.log('文件信息:', req.file ? req.file.filename : '无文件');
    
    // 硬盘存储的响应
    if (req.body.type) {
        return res.json({
            code: 200,
            msg: "文件上传成功",
            data: {
                filename: req.file.filename,
                path: req.file.path
            }
        });
    }
    
    // 内存存储的响应
    return res.json({
        code: 200,
        msg: "文件已在内存中接收成功",
        data: {
            filename: req.file.originalname,
            size: req.file.size
        }
    });
});

router.post("/excelTest",dynamicUpload,async function(req,res){//excel解析测试
    // 检查是否收到文件
    if (!req.file) {
        return res.status(400).send({ code: 400, msg: "未上传文件" });
    }

    try {
        // 从内存获取文件数据
        let workbook
        // 内存存储模式：直接从buffer读取
        workbook = XLSX.read(req.file.buffer, { type: 'buffer' })

        // 获取第一个工作表
        const sheetName = workbook.SheetNames[0]
        const worksheet = workbook.Sheets[sheetName]

        // 将工作表转换为JSON
        const jsonData = XLSX.utils.sheet_to_json(worksheet)

        // 返回解析结果
        res.send({
            code: 200,
            msg: "Excel解析成功",
            data: jsonData
        });

    } catch (error) {
        console.error("Excel解析失败:", error);
        res.status(500).send({
            code: 500,
            msg: "Excel解析失败",
            error: error.message
        });
    }
})

module.exports = router;
    